package edu.qd.learn.newchapter.chapter03.reflect.work;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 测试第二题
 * 二、编写一个类`Calculator`，
 * 包含四个私有方法`add(int a, int b)`、
 * `subtract(int a, int b)`、
 * `multiply(int a, int b)`和
 * `divide(int a, int b)`，
 * 分别用于进行加法、减法、乘法和除法运算，
 * 并返回计算结果。
 * 使用反射机制调用这些私有方法，
 * 计算并输出以下表达式的结果：“((10 + 5) * 2 - 15) / 3”。
 * <p>
 * 提示：
 * <p>
 * 1. 使用`Class.forName()`方法获取`Calculator`类的`Class`对象。
 * 2. 使用`Class`对象的`getDeclaredMethod()`方法获取方法对象。
 * 3. 使用方法对象的`setAccessible(true)`方法设置私有方法可访问。
 * 4. 使用方法对象的`invoke()`方法调用私有方法进行计算。
 *
 * @author 布衣
 */
public class TestQuestion2 {

    public static Method getMethodByMyself(Class c1,String method){
        Method me = null;
        try {
            me = c1.getDeclaredMethod(method, int.class, int.class);
            if (!me.isAccessible()) {
                me.setAccessible(true);
            }
            return me;
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }

    //1算法题  ： easy
    //1.1 "(1+2)+(3-2)*(2-3+(4+5))"  (4+5) java String 里面的方法或者分析
    //[(4+5),(2-3+$),(3-2)*$,(1+2)+$]

    //2 算法题  easy  leetcode 20
    // {}[]([({})(()])


    public static void main(String[] args) {
//        ((10 + 5) * 2 - 15) / 3
        //反射第一种方案 :class.forName  第二  ：
//        类名.class  String.class
//        Class c = Calculator.class;
        try {
            Class c1 = Class.forName("edu.qd.learn.newchapter.chapter03.reflect.work.Calculator");

            Object o = c1.newInstance();

            Method add = getMethodByMyself(c1,"add");
            int sum = (int)add.invoke(o, 10, 5);

            Method multiply = getMethodByMyself(c1,"multiply");
            int multiply1 = (int)multiply.invoke(o, sum, 2);


            Method subtract = getMethodByMyself(c1,"subtract");
            int subtract1 = (int)subtract.invoke(o, multiply1, 15);


            Method divide = getMethodByMyself(c1,"divide");
            int divide1 = (int)divide.invoke(o, subtract1, 3);
            System.out.println(divide1);
//            Method add = c1.getDeclaredMethod("add", int.class, int.class);
//            if (!add.isAccessible()) {
//                add.setAccessible(true);
//            }
//            int sum1 = (int) add.invoke(o, 10, 5);
//
//            Method multiply = c1.getDeclaredMethod("multiply", int.class, int.class);
//            if (!multiply.isAccessible()) {
//                multiply.setAccessible(true);
//            }
//            int mul1 = (int) multiply.invoke(o, sum1, 2);
//
//            Method subtract = c1.getDeclaredMethod("subtract", int.class, int.class);
//            if (!subtract.isAccessible()) {
//                subtract.setAccessible(true);
//            }
//            int sub1 = (int) subtract.invoke(o, mul1, 15);
//
//            Method divide = c1.getDeclaredMethod("divide", int.class, int.class);
//            if (!divide.isAccessible()) {
//                divide.setAccessible(true);
//            }
//            int div1 = (int) divide.invoke(o, sub1, 3);
//
//            System.out.println(div1);

        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException  |
                 InvocationTargetException e) {
            throw new RuntimeException(e);
        }

    }

}
